perm filename PALINL.LST[S1,ALS] blob sn#483577 filedate 1979-10-26 generic text, type T, neo UTF8
PASCAL/SAIL 1.1    6-SEP-79    COMPILATION LIST PRODUCED ON 26-OCT-79  AT 13:34:47     PAGE  1

    1   C;

PASCAL/SAIL 1.1    6-SEP-79         COMPILATION LIST PRODUCED ON 26-OCT-79  AT 13:34:47     PAGE   2

    1   (* $A+,D+*)
    2   
    3   PROGRAM PALINDROME(OUTPUT);
    4   
    5   CONST   NUMMAX = 4; PALMAX = 100;  NUMLIM = 7; PALLIM = 101;
    6           TABMAX = 500;  TABLIM = 501;
    7   VAR C, I, J, K, L, M, N, NXTOT, TABL, NMAX, NMIN, DCLASS,
    8            NUMVAL, CVAL, CVAL2, PALTOT, PALVAL, CARRY : INTEGER;
    9           CMIN, CMAX : INTEGER; 
   10       NUM : ARRAY [1..NUMLIM] OF INTEGER;
   11       PAL, PAL2 : ARRAY [1..PALLIM] OF INTEGER;
   12       TAB : ARRAY [0..TABLIM] OF INTEGER;
   13       TEMP : ARRAY [1..5] OF INTEGER;
   14   
   15   BEGIN (* MAIN PROGRAM*)
   16   FOR I := 1 TO NUMMAX DO NUM[I] := 0;
   17   NUM [2] := 1; NUMVAL := 2;              (* INITIAL CONDITIONS *)
   18   WRITELN (OUTPUT,
   19           '  PALINDROME FORMATION TESTED TO A MAXIMUM OF',PALMAX:4,' DIGITS');
   20   WRITELN (OUTPUT);
   21   WHILE NUMVAL <= NUMMAX DO
   22       BEGIN (*WHILE NUMVAL <= NUMMAX*)
   23       CVAL := NUMVAL DIV 2;
   24       CVAL2 := CVAL + NUMVAL MOD 2;
   25       CMIN := 1;
   26       CMAX := 19;                         (* GETS REDUCED BY 1 BELOW*)
   27       IF CVAL > 1 THEN FOR I := 2 TO CVAL DO
   28           BEGIN
   29           CMIN := CMIN * 19;
   30           CMAX := CMAX * 19;
   31           END;
   32       IF (CVAL2 - CVAL) = 1 THEN
   33           BEGIN
   34           CMIN := CMIN * 10;
   35           CMAX := CMAX * 10;
   36           END;
   37       CMAX :=  CMAX - 1;
   38           
   39       WRITELN (OUTPUT,'DATA FOR',NUMVAL:2,'-DIGIT DECIMAL NUMBERS');
   40       I := CMAX -CMIN + 1;
   41       WRITELN(OUTPUT,'   WHICH CAN BE GROUPED INTO',I:5,' CLASSES');
   42       WRITELN(OUTPUT);
   43       WRITELN(TTY);
   44       WRITELN (TTY,'DATA FOR',NUMVAL:2,'-DIGIT DECIMAL NUMBERS'); BREAK;
   45       WRITELN(OUTPUT,'CLASS   ADDS   RESULTING PALINDROME');
   46       WRITELN(OUTPUT,
   47           '               ONLY CLASSES REQUIRING 4 OR MORE ADDS ARE SHOWN');
   48       DCLASS := NUMVAL;
   49       FOR I := 1 TO PALMAX DO PAL[I] := 0;
   50       FOR I := 0 TO TABMAX DO TAB[I] := 0;    (* PALINDROME ADD DATA *)
   51       PALTOT := 0;                            (* COUNT OF NUMBER OF PALINDROMES *)
   52       NXTOT := 0;                             (* COUNT OF NON-PALINDROMES*)
   53       NMAX := 0;                              (* MAXIMUM ADDS FOR A PALINDROME*)
   54       NMIN := 500;                            (* MINIMUN ADDS FOR INTRANSIGENTS *)
   55       M := 0;
   56       FOR C := CMIN TO CMAX DO
   57           BEGIN                           (* FOR C := CMIN TO CMAX*)
   58           I := C;
   59           J := CVAL;  L := CVAL2 + 1;
   60           IF (CVAL2 - CVAL) = 1 THEN
   61               BEGIN
   62               TEMP[CVAL2] := I MOD 10;
   63               NUM[CVAL2] := TEMP[CVAL2];
   64               I := I DIV 10;
   65               END;
   66           FOR K := CVAL DOWNTO 1 DO
   67               BEGIN
   68               TEMP[K] := I MOD 19;
   69               IF TEMP[K] < 10 THEN
   70                   BEGIN
   71                   IF K = 1 THEN
   72                       BEGIN
   73                       NUM[L] := TEMP[K] -1;
   74                       NUM[J] := 1;
   75                       END
   76                   ELSE 
   77                       BEGIN
   78                       NUM[L] := TEMP[K];
   79                       NUM[J] := 0;
   80                       END;
   81                   END
   82               ELSE
   83                   BEGIN
   84                   NUM[L] := 9;
   85                   NUM[J] := TEMP[K] - 9;
   86                   END;
   87               J := J - 1;
   88               L := L + 1;
   89               I := I DIV 19;
   90               END;
   91   (*      FOR I := 1 TO NUMVAL  DO WRITE(TTY,NUM[I]:1); WRITE(TTY,'  '); *)
   92           N := 0;                         (* TO COUNT NUMBER OF ADDITIONS *)
   93           FOR I := 1 TO NUMVAL DO PAL[I] := NUM[I];
   94           FOR I := NUMVAL + 1 TO PALMAX DO PAL[I] := 0;
   95           PALVAL := NUMVAL;
   96           WHILE PALVAL <= PALMAX DO
   97               BEGIN                                   (* WHILE PALVAL <= PALMAX*)
   98               I := 1; J := PALVAL;
   99               WHILE ((PAL[I] = PAL [J]) AND (I < J)) DO
  100                   BEGIN
  101                   I := I + 1;  J := J - 1;
  102                   END;
  103               IF I >= J THEN
  104                   BEGIN
  105                   TAB[N] := TAB[N] + 1;           (*ADD TO TABLE OF DEPTHS*)
  106                   IF N > NMAX THEN NMAX := N;
  107                   IF N > 3 THEN
  108                       BEGIN
  109                       FOR J := 1 TO CVAL2 DO
  110                           BEGIN
  111                           WRITE (OUTPUT,TEMP[J]:3);
  112                           WRITE (TTY,TEMP[J]:3);
  113                           END;
  114                       WRITE(OUTPUT,N:6,'   ');
  115                       FOR I := 1 TO PALVAL DO
  116                           BEGIN
  117                           WRITE(OUTPUT,PAL[I]:1);
  118                           IF I = 72 THEN
  119                               BEGIN
  120                               WRITELN(OUTPUT);
  121                               WRITE(OUTPUT,'          ');
  122                               END;
  123                           END;
  124                       WRITELN(OUTPUT);
  125                       END;
  126                   PALTOT := PALTOT + 1;
  127                   PALVAL := PALMAX + 1;
  128                   END
  129               ELSE                                   (* STILL NOT A PALINDROME*)
  130                   BEGIN                               (* TRY ANOTHER ADD*)
  131                   J := PALVAL; CARRY := 0;
  132                   FOR I := 1 TO PALVAL DO
  133                       BEGIN                           (* ADD NUMBERS*)
  134                       PAL2[I] := PAL[I] + PAL[J] + CARRY;
  135                       IF PAL2[I] > 9 THEN
  136                           BEGIN
  137                           PAL2[I] := PAL2[I] - 10;  CARRY := 1;
  138                           END
  139                       ELSE CARRY := 0;
  140                       J := J - 1;
  141                       END;                            (* ADD NUMBERS*)
  142                   IF CARRY = 1 THEN
  143                       BEGIN
  144                       PALVAL := PALVAL +1; PAL2[PALVAL] := 1;
  145                       END;
  146                   N := N + 1;
  147                   FOR I := 1 TO PALVAL DO PAL[I] := PAL2[I];
  148                   END;
  149   
  150               END                      (* WHILE PALVAL <= PALMAX*);
  151           END;                            (* FOR C := CMIN TO CMAX*)
  152       WRITELN(OUTPUT);
  153       WRITELN(OUTPUT,'PALINDROMES GROUPED AS TO THEIR ADD DEPTHS');
  154       WRITELN(OUTPUT);
  155       WRITELN(OUTPUT,
  156           '      ADDS  CLASSES   ADDS  CLASSES   ADDS  CLASSES   ADDS  CLASSES');
  157       M := 0;
  158       FOR I := 0 TO NMAX DO
  159           BEGIN
  160           IF TAB[I] <> 0 THEN
  161               BEGIN
  162               WRITE(OUTPUT,I:10,TAB[I]:6);
  163               M := M + 1;
  164               IF (M MOD 4) = 0 THEN WRITELN(OUTPUT);
  165               END;
  166           END;
  167       WRITELN(OUTPUT);
  168       WRITELN(OUTPUT);
  169       NUMVAL := NUMVAL + 1;
  170       END (*WHILE NUMVAL <= NUMMAX*);
  171   END.

   0 ERROR(S) DETECTED

HIGHSEG:   0K +  715 WORD(S)
LOWSEG :   0K +  832 WORD(S)


RUNTIME: 00:00.622      ELAPSED: 00:00:20.2      6139 CHARS